package org.suanfaTranning.ST200_Chatpter1_LineTable_HashTable_String.hashTable;

/**
 * @Auther: qingle
 * @Date: 2024/9/11-1:12
 * @Description:
 * 在这个 Java 版本中，我们使用了一个整型数组 times 来存储时间戳，以及两个整型变量 left 和 right 来分别表示数组的左右指针。ping 方法将新的时间戳添加到数组的末尾，并更新 right 指针。然后，它会移动 left 指针，直到所有在 left 指针之前的时间戳都超出了当前时间戳3000毫秒的范围。最后，ping 方法返回当前时间戳之前3000毫秒内的时间戳数量，这是通过计算 right 和 left 指针之间的差值来实现的。
 *
 * 请注意，这个实现假设数组的大小足够大，可以存储所有可能的时间戳。在实际应用中，可能需要根据预期的请求量来调整数组的大小。此外，这个实现没有处理数组溢出的情况，如果 right 指针超出了数组的界限，需要适当地处理这种情况。
 * @version: 1.0
 */
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

public class RecentCounter3 {
	private final int[] times;
	private int left;
	private int right;

	public RecentCounter3() {
		// 初始化数组大小为10005，可以根据需要调整大小
		times = new int[10005];
		left = 0;
		right = 0;
	}

	public int ping(int t) {
		// 将当前时间戳添加到数组中，并增加right指针
		times[right++] = t;
		// 移动left指针，直到数组中的所有时间戳都在当前时间戳的3000毫秒之前
		while (left < right && times[left] < t - 3000) {
			left++;
		}
		// 返回当前时间戳之前3000毫秒内的时间戳数量
		return right - left;
	}

	public static void main(String[] args) {
		RecentCounter counter = new RecentCounter();
		int[] timestamps = {1, 100, 3001, 3002};
		int[] expectedOutput = {1, 2, 3, 3};

		for (int timestamp : timestamps) {
			int result = counter.ping(timestamp);
			System.out.println(result); // 打印每次 ping 的结果
		}
	}
}